home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / signal.arc / XCSIGNAL.ASM < prev   
Assembly Source File  |  1985-07-19  |  9KB  |  264 lines

  1.       Page    ,132
  2.         Title   'Interrupt handler support for Lattice C Version 2.1x'
  3. ;;
  4. ;    Author: Cheyenne Wills
  5. ;    Addr:   12 West Locust St.
  6. ;            Mechanicsburg Pa. 17055
  7. ;
  8. ;    Compuserv [70376,555]
  9. ;
  10. ;    December 1984
  11. ;
  12. ;Permission is granted to use, distribute and/or modify this code unless
  13. ;done for direct commercial profit.
  14. ;Author's name, address and this notice must be included in any copies.
  15. ;
  16. ;No guarantees or warranties of any kind:  This code is distributed
  17. ;"AS IS" without any warranty.  You are soley responsible for the
  18. ;selection of the program to achieve your intended results and for the
  19. ;results actually obtained.
  20. ;
  21. ;Any suggestions for improvements gratefully accepted
  22. ;
  23. ;;
  24.         Include DOS.MAC
  25.         DSEG
  26.         Subttl  'XCINTBOO - Interrupt Boot Code'
  27. ;
  28. ;       The following code is relocated into storage and
  29. ;       is the "1st" level interrupt handler
  30. ;
  31. XCINTBOO Proc Far
  32.         If      COM
  33.         Db      9Ah             ;Long Call
  34.         Dw      XCINTCOM        ;Ip
  35. FuncCCs Dw      0               ;And for the benifit of EXE2BIN...
  36.         Else
  37.         Call    Far Ptr XCINTCOM
  38.         Endif
  39.         Iret
  40. FuncIp  Dw      ?       ;IP for the C interrupt handler
  41. FuncCs  Dw      ?       ;CS for the C interrupt handler
  42. FuncSs  Dw      ?       ;SS for the C interrupt handler
  43. FuncDs  Dw      ?       ;DS for the C interrupt handler
  44. Intrcl  Equ     $-XCINTBOO ;Length of above section..
  45. XCINTBOO Endp
  46.         If      S8086 Eq 0
  47. Intradr Dd      XCINTBOO        ;Segement/offset of above code
  48.         Endif
  49.         ENDDS
  50.         Page    ,132
  51.         PSEG
  52.         Subttl  'XCINTRIN - Interrupt Handler Initializer'
  53.         Public  XCINTRIN
  54.         If      LPROG
  55. XCINTRIN Proc   Far
  56.         Else
  57. XCINTRIN Proc   Near
  58.         Endif
  59.         Push    Bp
  60.         Mov     Bp,Sp
  61. ;------
  62.         If      S8086
  63.         Mov     Ax,[Bp+6]       ;Get the pointer to the function
  64.         Mov     FuncIp,Ax       ;Where Interserv will call to..
  65.         Mov     FuncCs,Cs       ;Current CS..
  66.         If      COM
  67.         Mov     FuncCCs,Cs      ;Com files don't relocate, (but we do..)
  68.         Endif
  69.         Mov     FuncSs,Ss       ;Save the Current stack segment address
  70.         Mov     FuncDs,Ds       ;Save the Current data segment address
  71. ;
  72.         Mov     Di,[Bp+8]       ;Get the pointer to the IBC area
  73.         Lea     Si,XCINTBOO     ;Get the address to the actual code
  74.         Mov     Cx,Intrcl       ;And the length of the code
  75.         Cld                     ;Make sure we go in the right direction
  76.         Rep Movsb               ;And move it..
  77. ;
  78.         Mov     Bx,[Bp+4]       ;Get the interrupt number..
  79.         Mov     Al,Bl           ;Into Al
  80.         Mov     Ah,25h          ;Subfunction 25
  81.         Mov     Dx,[Bp+8]       ;Get the address of the IBC
  82.         Int     21h             ;And install it..
  83.         EndIf
  84.         If      D8086
  85.         Mov     Ax,[Bp+6]       ;Get the pointer to the function
  86.         Mov     Bx,[Bp+8]
  87.         Mov     FuncIp,Ax       ;Where Interserv will call to..
  88.         Mov     FuncCs,Bx       ;..
  89.         Mov     Ax,[Bp+12]      ;We have a "New stack segment.."
  90.         Mov     FuncSs,Ax       ;Save the Current stack segment address
  91.         Mov     FuncDs,Ds       ;Save the Current data segment address
  92. ;
  93.         Push    Ds              ;Save Ds..
  94.         Les     Di,[Bp+10]      ;Move the code into
  95.         Lds     Si,Intradr      ;the IBC area
  96.         Mov     Cx,Intrcl       ;..
  97.         Cld
  98.         Rep Movsb
  99. ;
  100.         Mov     Bx,[Bp+4]       ;Get the interrupt number..
  101.         Mov     Al,Bl           ;Into Al
  102.         Mov     Ah,25h          ;Subfunction 25
  103.         Lds     Dx,[Bp+10]      ;Get the address of the IPC
  104.         Int     21h             ;And install it..
  105.         Pop     Ds
  106.         EndIf
  107.         If      P8086
  108.         Mov     Ax,[Bp+8]       ;Get the pointer to the function
  109.         Mov     Si,Ax           ;...
  110.         Mov     Ax,[Si]         ;...
  111.         Mov     Bx,[Si+2]       ;...
  112.         Mov     FuncIp,Ax       ;Where Interserv will call to..
  113.         Mov     FuncCs,Bx       ;..
  114.         Mov     FuncSs,Ss       ;Save the Current stack segment address
  115.         Mov     FuncDs,Ds       ;Save the Current data segment address
  116. ;
  117.         Mov     Di,[Bp+10]      ;Move into the IBC area..
  118.         Mov     Si,Offset XCINTBOO
  119.         Mov     Cx,Intrcl
  120.         Cld
  121.         Rep Movsb
  122. ;
  123.         Mov     Bx,[Bp+6]       ;Get the interrupt number..
  124.         Mov     Al,Bl           ;Into Al
  125.         Mov     Ah,25h          ;Subfunction 25
  126.         Mov     Dx,[Bp+10]      ;Get the address of the IPC
  127.         Int     21h             ;And install it..
  128.         EndIf
  129.         If      L8086
  130.         Mov     Ax,[Bp+8]       ;Get the pointer to the function
  131.         Mov     Bx,[Bp+10]
  132.         Mov     FuncIp,Ax       ;Where Interserv will call to..
  133.         Mov     FuncCs,Bx       ;..
  134.         Mov     Ax,[Bp+14]      ;We have a "New stack segment.."
  135.         Mov     FuncSs,Ax       ;Save the Current stack segment address
  136.         Mov     FuncDs,Ds       ;Save the Current data segment address
  137. ;
  138.         Push    Ds
  139.         Les     Di,[Bp+12]      ;Move into the IBC area
  140.         Lds     Si,Intradr
  141.         Mov     Cx,Intrcl
  142.         Cld
  143.         Rep Movsb
  144. ;
  145.         Mov     Bx,[Bp+6]       ;Get the interrupt number..
  146.         Mov     Al,Bl           ;Into Al
  147.         Mov     Ah,25h          ;Subfunction 25
  148.         Lds     Dx,[Bp+12]      ;Get the address of the IPC
  149.         Int     21h             ;And install it..
  150.         Pop     Ds
  151.         EndIf
  152.         Pop     Bp
  153.         Ret
  154. XCINTRIN Endp
  155.         Page    ,132
  156.         Subttl XCINTCOM
  157. ;       All interrupts that are being processed by a C routine will
  158. ;       come through here.
  159. ;       We will set up the conditions to run a C program.
  160. ;
  161. ;                                            Stack on entry
  162. ;           +------+                +------+
  163. ;           =      =                =      =
  164. ;  SP->     +------+   +0      Bp-> +------+  +0
  165. ;           | SP   |                | Bp   |
  166. ;           +------+   +2           +------+  +2
  167. ;           | SS   |         +---   |oIBC@ |
  168. ;  ICP-->   +------+   +4    |      +------+  +4
  169. ;           |Call  |         |      |sIBC@ |
  170. ;           +------+   +5    |      +------+
  171. ;           |IP    |         |
  172. ;           +------+   +7    |
  173. ;           |CS    |         |
  174. ;  oIBC@->  +------+   +9 <--+
  175. ;           |IRET  |
  176. ;           +------+  +10
  177. ;           |FUNCIP|
  178. ;           +------+  +12
  179. ;           |FUNCCS|
  180. ;           +------+  +14
  181. ;           |FUNCSS|
  182. ;           +------+  +16
  183. ;           |FUNCDS|
  184. ;           +------+
  185. ;
  186. XCINTCOM Proc   Far
  187.         Push    Bp              ;Save
  188.         Mov     Bp,Sp           ;So we can see the stack
  189.         Push    Es
  190.         Push    Ds
  191.         Push    Bx              ;Save BX
  192. ;
  193.         Cli
  194.         Mov     Es,[Bp+4]       ;Set up ES to point to the ICP
  195.         Mov     Bx,[Bp+2]       ;Get offset to the "IRET"
  196.         Sub     Bx,9            ;some room yet
  197.         Mov     Es:[Bx],Sp      ;save stack seg
  198.         Mov     Es:[Bx+2],Ss    ;and the stack pointer
  199.         Mov     Ss,Es:[Bx+14]
  200.         Mov     Ds,Es:[Bx+16]
  201.         Mov     Sp,Bx
  202. ;- Save all the other registers..
  203.         Push    Ax
  204.         Push    Bx
  205.         Push    Cx
  206.         Push    Dx
  207.         Push    Si
  208.         Push    Di
  209.         Push    Ds
  210.         Push    Es
  211.         Push    Bp
  212.         PushF
  213.         Mov     Bp,Sp
  214. ;- Call the C function thats handles this interrupt
  215.         If      LPROG
  216.         Call    Dword Ptr Es:[Bx+10]
  217.         Else
  218.         Call    Es:[Bx+10]
  219.         Endif
  220. ;- Restore the callers environment
  221.         Cli
  222.         Mov     Sp,Bp
  223.         PopF
  224.         Pop     Bp
  225.         Pop     Es
  226.         Pop     Ds
  227.         Pop     Di
  228.         Pop     Si
  229.         Pop     Dx
  230.         Pop     Cx
  231.         Pop     Bx
  232.         Pop     Ax
  233.         Mov     Bx,Sp                   ;set up to restore stack
  234.         Mov     Sp,Es:[Bx]
  235.         Mov     Ss,Es:[Bx+2]            ;stack restored
  236. ;- And return back to the IBC so it can return back to the caller..
  237.         Pop     Bx
  238.         Pop     Ds
  239.         Pop     Es
  240.         Pop     Bp
  241.         Ret                     ;all done
  242. XCINTCOM        Endp
  243.         Page    ,132
  244.         Subttl  '_ENAINT/_DISAINT Enable/Disable interrupts'
  245.         Public  _ENAINT,_DISAINT
  246.         If      LPROG
  247. _ENAINT  Proc   Far
  248.         Else
  249. _ENAINT  Proc   Near
  250.         Endif
  251.         Sti
  252.         Ret
  253. _ENAINT Endp
  254.         If      LPROG
  255. _DISAINT  Proc   Far
  256.         Else
  257. _DISAINT  Proc   Near
  258.         Endif
  259.         Cli
  260.         Ret
  261. _DISAINT Endp
  262.         ENDPS
  263.         End
  264.